package edu.gdkm.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
//创建切面类
@Aspect
public class MyAspect {
    //定义切入点
    /**
     * 切入点 规则
     * public * addNewUser(entity.User)： “*”表示匹配所有类型的返回值。
     * public void *(entity.User)： “*”表示匹配所有方法名。
     * public void addNewUser(..)： “..”表示匹配所有参数个数和类型。
     * * com.service.*.*(..)：匹配com.service包下所有类的所有方法。
     * * com.service..*.*(..)：匹配com.service包及其子包下所有类的所有方法
     */

    @Pointcut("execution(* edu.gdkm.factory.ToyFactory2.*(..))")
    public void mypointcut(){}
    //前置增强
    //JoinPoint:目标方法的类名，方法名，参数列表
    @Before("mypointcut()")
    public void myBefore(JoinPoint joinPoint) {
        System.out.println("-------------前置通知-------------"+joinPoint.getSignature().getName());
    }
    //后置增强
    //JoinPoint:目标方法的类名，方法名 参数列表
    @After("mypointcut()")
    public void myAfter(JoinPoint joinPoint) {
        System.out.println("-------------后置通知-------------"+joinPoint.getSignature().getName());
    }
    //环绕增强
    //目标方法前后都可织入增强处理
    //功能最强大的增强处理
    //可获取或修改目标方法的参数，返回值，可对他进行异常处理，甚至可以决定目标方法是否执行。
    //ProceedingJoinPoint:目标方法类名，方法名，参数列表
    //pjp.proceed()：执行目标方法
    @Around("mypointcut()")
    public void myAround(ProceedingJoinPoint pjp) throws Throwable {

        System.out.println("-------------环绕通知业务功能执行前-------------");
        pjp.proceed();
        System.out.println("-------------环绕通知业务功能执行后-------------");
    }
}
